package ch.penas.web;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.apache.log4j.Logger;
import org.primefaces.event.FlowEvent;

import ch.penas.business.dom.Agenda;
import ch.penas.business.dom.Formateur;
import ch.penas.business.dom.LoginFormateur;
import ch.penas.business.dom.RechercheAgenda;
import ch.penas.business.dom.RechercheFormateur;
import ch.penas.business.service.AgendaService;
import ch.penas.business.service.AgendaServiceImpl;

/** @author Daniel */
@ManagedBean(name = "manageBeanAgenda")
@SessionScoped
public final class ManageBeanAgenda implements Serializable {

	/**La serialization de la class ManageBeanAgenda pour question de securiter.*/
	private static final long serialVersionUID = 7821547244981771579L;

	private static final Logger LOGGER = Logger.getLogger(ManageBeanAgenda.class);

	/** mAgenda est egale a l'agenda. */
	private Agenda mAgenda;
	
	private Formateur mRechercheFormateurPourAgenda;
	
	private Agenda mAgendaPlanning;

	/** mService est egale au service de l'agenda. */
	private AgendaService mService;
	
	/** mRechercheAgenda est egale a la recherche d'agenda. */
	private RechercheAgenda mRechercheAgenda;
	
	private RechercheFormateur mRechercheFormateur;
	
	public RechercheFormateur getmRechercheFormateur() {
		return mRechercheFormateur;
	}
	/** mLoginFormateur est egale au logine du formateur. */
	private LoginFormateur mLoginFormateur;

	private boolean skip;
    
    private static Logger logger = Logger.getLogger(ManageBeanAgenda.class.getName());

    /** Constructeur par defaut de la class ManageBeanAgenda. */
	public ManageBeanAgenda() {
		this.mAgenda = new Agenda();
		this.mAgendaPlanning = new Agenda();
		this.mService = new AgendaServiceImpl();
		this.mRechercheAgenda = new RechercheAgenda();
		this.mRechercheFormateur = new RechercheFormateur();
		this.mLoginFormateur = new LoginFormateur();
		this.mRechercheFormateurPourAgenda = new Formateur();
	}
	
    /** Permet d'ajouter et de modifier des evenement de l'agenda.
     *
     * @return successAgenda si tous c'est bien passer !
     */
	public String addEvent() {
        this.mService.addEvent(this.mAgendaPlanning);
        return "successAgenda";
    }
	
    /** Permet de supprimer des evenement de l'agenda.
     *
     * @return successDeleteAgenda si la suppresion c'est bien passer !
     */
	public String del() {
        this.mService.del(this.mAgenda);
        return "successDeleteAgenda";
    }
	
	public String toSearch() {
        LOGGER.debug("recherche");
        return "rechercheFormateur";
    }
	
	public String searchFormateurPourAgenda() {
    	this.mService.searchFormateurPourAgenda(this.mRechercheFormateur);
        return null;
    }
    
    public String searchFini() {
    	this.mRechercheAgenda.setSearchNom(this.mRechercheFormateurPourAgenda.getNom());
    	this.mRechercheAgenda.setSearchPrenom(this.mRechercheFormateurPourAgenda.getPrenom());
    	this.mService.search(this.mRechercheAgenda);
    	this.mAgendaPlanning.setUser(this.mService.getTempsRechercheAgenda().getUser());
    	this.mRechercheAgenda = new RechercheAgenda();
    	this.mRechercheFormateur = new RechercheFormateur();
        return "successFormateur";
    }
    
    /** Permet de ce logger a son compte d'utilisateur.
     *
     * @return successLogin si l'utilisateur est trouver sinon retorun
     * failure si rien n'a été trouver
     */
	public String login() {
		this.mService.login(this.mLoginFormateur);
		if (this.mService.getLoginIsTrue()) {
			this.mAgendaPlanning.setUser(this.mService.getLoginUser());
			return "successLogin";
		} else {
			this.mLoginFormateur = new LoginFormateur();
			return "failure";
		}
	}
    
    public String onFlowProcess(FlowEvent event) {  
    	logger.info("Current wizard step:" + event.getOldStep());  
    	logger.info("Next step:" + event.getNewStep());  
          
        if(skip) {  
            skip = false;
            return "confirm";  
        }  
        else {  
            return event.getNewStep();  
        }  
    }

    /** Permet de recuperer la valeur de mService.
     *
     * @return mService qui est egale au service d'e l'agenda
     */
	public AgendaService getService() {
		return mService;
	}
	/** Permet de modifier la valeur de mService.
	 *
	 * @param mService est egale au mService de l'agenda
	 */
	public void setService(AgendaService mService) {
		this.mService = mService;
	}
	
    /** Permet de recuperer la valeur de mAgenda.
     *
     * @return mAgenda qui est egale a un evenement de l'agenda
     */
	public Agenda getAgenda() {
		return this.mAgenda;
	}
	
	public Agenda getAgendaPlanning() {
		return this.mAgendaPlanning;
	}
	
	public void setSelectedAgenda(final Agenda agenda) {
		this.mAgenda = agenda;
	}
	public Agenda getSelectedAgenda() {
		return this.mAgenda;
	}
	
	public RechercheAgenda getSelectedRechercheAgenda() {
		return this.mRechercheAgenda;
	}
	
	public RechercheAgenda getRechercheAgenda() {
		return mRechercheAgenda;
	}

	public void setRechercheAgenda(RechercheAgenda mRechercheAgenda) {
		this.mRechercheAgenda = mRechercheAgenda;
	}
	
	public LoginFormateur getFormateur() {
		return this.mLoginFormateur;
	}
	
    public boolean isSkip() {  
        return skip;  
    }
    public void setSkip(boolean skip) {  
        this.skip = skip;  
    }
    
	public Formateur getSelectedRechercheFormateurPourAgenda() {
		return this.mRechercheFormateurPourAgenda;
	}
	public void setSelectedRechercheFormateurPourAgenda(Formateur f) {
		this.mRechercheFormateurPourAgenda = f;
	}
}